

#include <stdio.h>

int main()
{
  // 1. 指针数组 (Array of Pointers)
  // 指针数组是一个数组，其元素都是指针。
  int a = 100, b = 200, c = 300, d = 400;
  int *arr_of_ptrs[4] = {&a, &b, &c, &d};

  printf("------------指针数组示例:------------\n");
  for (int i = 0; i < 4; i++)
  {
    printf("arr_of_ptrs[%d] = %p, *arr_of_ptrs[%d] = %d\n",
           i, (void *)arr_of_ptrs[i], i, *arr_of_ptrs[i]);
  }

  // 2. 数组指针 (Pointer to Array)
  // 数组指针是一个指针，它指向整个数组。
  int arr[4] = {10, 20, 30, 40};
  int *ptr = arr;
  printf("指针示例: *ptr = %d\n", *(ptr + 2)); // 输出: 30

  // 声明一个数组指针：指向包含4个整数的数组
  int (*arr_ptr)[4] = &arr;

  printf("\n------------数组指针示例:------------\n");
  printf("arr_ptr地址: %p\n", (void *)arr_ptr);
  printf("arr地址: %p\n", (void *)arr);

  // 通过数组指针访问数组元素
  printf("第一个元素: %d\n", (*arr_ptr)[0]);
  printf("第二个元素: %d\n", (*arr_ptr)[1]);

  // 指针算术：移动整个数组的大小
  printf("arr_ptr + 1地址: %p (前进%d字节)\n",
         (void *)(arr_ptr + 1),
         (int)((char *)(arr_ptr + 1) - (char *)arr_ptr));

  return 0;
}